/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package uy.edu.ort.arqsw.servicios;


import org.apache.log4j.Logger;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TemporalType;
import uy.edu.ort.arqsw.domino.EntradaBlog;
import uy.edu.ort.arqsw.domino.Tag;

/**
 *
 * @author victor
 */
@Stateless
public class EntradaBlogFacade implements EntradaBlogFacadeLocal {
    public static final Logger log = Logger.getLogger(EntradaBlogFacade.class);
    
    @PersistenceContext(unitName = "obligContenidoWeb-ejbPU")
    private EntityManager em;
    
    @Override
    public void crear(EntradaBlog entradablog) {
        log.debug("crear entradablog titulo=" + entradablog.getTitulo() + " autor=" + entradablog.getAutor() + " fecha=" + entradablog.getFecha().toString() + " contenido=" + entradablog.getContenido());
        em.persist(entradablog);
    }

    @Override
    public void editar(EntradaBlog entradaBlogOriginal, EntradaBlog entradaBlogModificada) {
        Query query = em.createQuery("SELECT e FROM EntradaBlog e WHERE e.fecha = :fecha and e.titulo = :titulo and e.autor = :autor");
        query.setParameter("fecha", entradaBlogOriginal.getFecha(), TemporalType.DATE);
        query.setParameter("titulo", entradaBlogOriginal.getTitulo());
        query.setParameter("autor", entradaBlogOriginal.getAutor());
        
        EntradaBlog res_find = (EntradaBlog) query.setMaxResults(1).getSingleResult();
        
        res_find.setAutor(entradaBlogModificada.getAutor());
        res_find.setTitulo(entradaBlogModificada.getTitulo());
        res_find.setFecha(entradaBlogModificada.getFecha());
        res_find.setContenido(entradaBlogModificada.getContenido());
        // actualizar tambien la lista de tags aca
        
        em.merge(res_find);
    }

    @Override
    public void remover(EntradaBlog entradablog) {
        Query query = em.createQuery("SELECT e FROM EntradaBlog e WHERE e.fecha = :fecha and e.titulo = :titulo and e.autor = :autor");
        query.setParameter("fecha", entradablog.getFecha(), TemporalType.DATE);
        query.setParameter("titulo", entradablog.getTitulo());
        query.setParameter("autor", entradablog.getAutor());
        
        EntradaBlog res_find = (EntradaBlog) query.setMaxResults(1).getSingleResult();
        
        em.remove(res_find);
    }

    @Override
    public List<EntradaBlog> buscar(Date fecha, String titulo, String autor, List<Tag> tags) {
        if (fecha == null && titulo.equals("") && autor.equals("") && tags.isEmpty()) {
            return obtenerTodas();
        } else {
            Query query;
            String strParametros = "";
            List<EntradaBlog> entradasAux;
            List<EntradaBlog> resultado = new ArrayList<EntradaBlog>();

            if (fecha != null) {
                strParametros += " e.titulo = :titulo";
            }
            if (!titulo.equals("")) {
                strParametros += " e.fecha = :fecha";
            }
            if (!autor.equals("")) {
                strParametros += " e.autor = :autor";
            }
            
            String strQuery = "SELECT e FROM EntradaBlog e";            
            
            if (!strParametros.equals("")) {
                strQuery += " WHERE" + strParametros;                            
            }
            
            query = em.createQuery(strQuery);
            
            if (fecha != null) {
                query.setParameter("fecha", fecha, TemporalType.DATE);
            }
            if (!titulo.equals("")) {
                query.setParameter("titulo", titulo);
            }
            if (!autor.equals("")) {
                query.setParameter("autor", autor);
            }
            
            entradasAux = (List<EntradaBlog>)query.getResultList();
            
            // esto se hace porque no podemos hacer que el equals de Tag compare por Tag.Valor
            for(EntradaBlog e : entradasAux) {
                Boolean encontrado = false;
                for(Tag t_e : e.getTagCollection()) {
                    for(Tag t_p : tags) {
                        if (t_e.getValor().equals(t_p.getValor())) {
                            encontrado = true;
                            resultado.add(e);
                            break;
                        }
                    }
                    if (encontrado) {
                        break;
                    }
                }
            }
            
            return resultado;
        }
    }

    @Override
    public List<EntradaBlog> obtenerTodas() {
        Query query = em.createQuery("SELECT e FROM EntradaBlog e");
        
        return (List<EntradaBlog>) query.getResultList();
    }    
}
